/**
 * 节流
 * @param fn
 * @param delay
 */
export function THROTTLE (fn, delay) {
  // 上一次执行 fn 的时间
  let previous = 0
  // 将 THROTTLE 处理结果当作函数返回
  return function (...args) {
    // 获取当前时间，转换成时间戳，单位毫秒
    const now = +new Date()
    // 将当前时间和上一次执行函数的时间进行对比
    // 大于等待时间就把 previous 设置为当前时间并执行函数 fn
    if (now - previous > delay) {
      previous = now
      fn.apply(this, args)
    }
  }
}

/**
 * 防抖
 * @param fn 是需要防抖处理的函数
 * @param wait 是时间间隔
 * @param immediate 表示第一次是否立即执行
 * @return {function} 返回客户调用函数
 */
export function DEBOUNCE (fn, wait = 50, immediate) {
  let timer = null
  return function (...args) {
    if (timer) clearTimeout(timer)
    // immediate 为 true 表示第一次触发后执行
    // timer 为空表示首次触发
    if (immediate && !timer) {
      fn.apply(this, args)
      immediate = false
      return
    }
    timer = setTimeout(() => {
      fn.apply(this, args)
    }, wait)
  }
}

/**
 * 判断是否是外部链接
 *
 * @param {string} path
 * @returns {Boolean}
 */
export function isExternal(path) {
  const isExternal = /^(https?:|http?:|mailto:|tel:)/.test(path)
  return isExternal
}
